// 导入所需的模块
const Koa = require('koa'); // Koa框架
const Router = require('koa-router'); // Koa路由
require('dotenv').config(); // 环境变量配置
const { koaBody } = require('koa-body'); // 请求体解析中间件
const logger = require('koa-logger'); // 请求日志中间件
const cors = require("@koa/cors"); // 跨域中间件
const atRegularTime = require("./src/utils/atRegularTime"); // 定时任务工具
const path = require('path'); // 路径处理模块
const http = require('http'); // HTTP模块
// 导出错误处理中间件
// const { logError } = require("./src/utils/data/error");
// 导入jwttoken模块
const { tokenValidator } = require("./src/utils/permission/appRouterPre"); // 导入middleware中的tokenValidator函数
const WebSocketService = require('./src/utils/websocket'); // WebSocket服务
require('./src/db/sqlinit'); // 数据库初始化

// Swagger相关模块
const swaggerJSDoc = require("swagger-jsdoc"); // Swagger文档生成
const { koaSwagger } = require("koa2-swagger-ui"); // Swagger UI界面

// 创建Koa应用和路由实例
const app = new Koa();
const router = new Router();

// 启动定时任务
atRegularTime();

// 创建HTTP服务器并初始化WebSocket服务
const server = http.createServer(app.callback());
new WebSocketService(server);

// websocketSever.getOnlineUsers();
// 配置跨域中间件
app.use(
  cors({
    origin: "*", // 允许所有来源
    methods: ["GET", "POST", "PUT", "DELETE"], // 允许的HTTP方法
    allowHeaders: ["Content-Type", "Authorization"], // 允许的请求头
  })
);

// 使用请求日志中间件
app.use(logger());

// Swagger配置选项
const swaggerOptions = {
  definition: {
    openapi: "3.0.0", // OpenAPI版本
    info: {
      title: "Koa API", // API标题
      version: "1.0.0", // API版本
      description: "Koa API documentation", // API描述
    },
    // ===== 新增安全配置 =====
    components: {
      securitySchemes: {
        BearerAuth: {  // 自定义名称（如 JWT）
          type: "http",
          scheme: "bearer",
          bearerFormat: "JWT", // 可选：标明 Token 格式
          description: "输入你的 JWT Token（格式：`Bearer <token>`）"
        }
      }
    },
    // ===== 全局启用安全校验（可选） =====
    security: [{
      BearerAuth: []
    }],
    servers: [ // API服务器配置
      { url: `http://localhost:${process.env.PORT || 3000}` } // 服务器URL
    ],
  },
  apis: ["./src/routes/*.js"], // API路由文件路径
};

// 生成Swagger文档规范
const swaggerSpec = swaggerJSDoc(swaggerOptions);

// 配置Swagger UI路由
router.get(
  "/docs",
  koaSwagger({
    routePrefix: false, // 禁用自动前缀
    swaggerOptions: {
      spec: swaggerSpec, // 使用生成的Swagger文档
    },
    customCss: `.topbar { display: none }`, // 自定义CSS样式
    customSiteTitle: "Koa API Docs", // 自定义文档标题
  })
);

/**
 * 配置 koa-body 中间件，用于处理 HTTP 请求体解析
 * 
 * 主要功能：
 * 1. 支持 multipart/form-data (文件上传)
 * 2. 支持 JSON/URL-encoded/文本等格式的请求体
 * 3. 提供文件上传的各种配置选项
 */
app.use(koaBody({
   /**
   * multipart: 是否启用 multipart/form-data 解析
   * - true: 启用文件上传支持
   * - false: 禁用文件上传
   */
  multipart: true, 
  formidable: {
    uploadDir: path.join(__dirname, '/src/uploads/tmp'), // 文件上传目录
    keepExtensions: true, // 是否保留文件扩展名
    maxFileSize: 100  * 1024 * 1024, // 最大文件大小(100MB)
    multiples: true ,// 是否支持多文件上传
     // 添加下面这个配置确保能解析非文件字段
    onFileBegin: (name, file) => {
      // 这里可以处理文件开始上传时的逻辑
      console.log(name);
      console.log(`开始上传文件: ${file.name}`);
      
    }
  },
  /**
   * formLimit: URL-encoded 表单数据的最大大小
   * - 这里设置为 10MB
   * - 可以是字符串形式(如'10mb')或数字形式(字节数)
   */
  formLimit: '10mb',
  /**
   * jsonLimit: JSON 请求体的最大大小
   * - 这里设置为 10MB
   */
  jsonLimit: '10mb',
  /**
   * textLimit: 纯文本请求体的最大大小
   * - 这里设置为 10MB
   */
  textLimit: '10mb',
   /**
   * 其他可能的 koa-body 配置:
   */
  // urlencoded: true, // 是否解析 application/x-www-form-urlencoded
  // json: true, // 是否解析 application/json
  // text: true, // 是否解析 text/plain
  // encoding: 'utf-8', // 请求体编码
  parsedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'], // 需要解析的 HTTP 方法
  // onError: (err, ctx) => {}, // 解析错误的回调函数
  // strict: true // 是否严格模式(只解析配置的类型)
}));
// 导入并注册各个路由模块
const userRoutes = require("./src/routes/user"); // 用户相关路由
// const pageRoutes = require("./src/routes/webPage"); // 页面相关
const filesRoutes = require("./src/routes/files"); // 文件相关路由
const otherRoutes = require("./src/routes/other"); // 其他路由

app.use(tokenValidator); // 使用tokenValidator验证中间件
// app.use(pageRoutes.routes()).use(pageRoutes.allowedMethods());
app.use(userRoutes.routes()).use(userRoutes.allowedMethods());
app.use(filesRoutes.routes()).use(filesRoutes.allowedMethods());
app.use(otherRoutes.routes()).use(otherRoutes.allowedMethods());

// 使用主路由中间件
app.use(router.routes()).use(router.allowedMethods());

// 整体捕获报错
// app.on('error', (err, ctx) => {
//   console.error('server error', err, ctx);
//   // 存入log_error表
//   logError(err, ctx);
// })

// ============= 启动服务 =============
const port = process.env.PORT || 3000; // 获取端口号，默认为3000
server.listen(port, () => {
  console.log('Server: http://localhost:' + port); // 打印服务器地址
  console.log('Swagger: http://localhost:' + port + '/docs'); // 打印Swagger文档地址
});